/*! \file dyn_fortranLinkage_bessel.h
 *
 * \author Joey Dumont <joey.dumont@gmail.com>
 *
 * \date 2012-08-23
 *
 * \brief Specifies the linkage to the Fortran subroutines
 * for the Bessel functions of complex argument.
 *
 * We seek to compute the Bessel and Hankel functions of complex
 * arguments and non-negative order. We also seek to compute the
 * functions for real arguments.
 *
 * As the algorithms are different for both (the complex
 * argument algorithm would work for real arguments too, but would
 * be slower), we use two implementations.
 *
 * For complex arguments, we use Amos's Fortran implementation @cite AMO86.
 * Using the extern keyword, we can call Fortran subroutines from C++
 * with the standard usage.
 *
 * For real arguments, we simply encapsulate the Boost implementations.
 * Usage to follow in BesselJ, BesselY, BesselI,
 * BesselK, Hankel.
 */

#ifndef DYN_FORTRANLINKAGE_BESSEL_H
#define DYN_FORTRANLINKAGE_BESSEL_H

extern "C"
{
/*! Bessel function of the first kind. */
extern void zbesj_(double*,double*,double*,int*,int*,double*,double*,int*,int*);

/*! Bessel function of the second kind. */
extern void zbesy_(double*,double*,double*,int*,int*,double*,double*,int*, double*,double*,int*);

/*! Modified Bessel function of the first kind. */
extern void zbesi_(double*,double*,double*,int*,int*,double*,double*,int*,int*);

/*! Modified Bessel function of the second kind. */
extern void zbesk_(double*,double*,double*,int*,int*,double*,double*,int*,int*);

/*! Hankel function of both kinds. Kind determined by integer argument. */
extern void zbesh_(double*,double*,double*,int*,int*,int*,double*,double*,int*,int*);
}

#endif // DYN_FORTRANLINKAGE_BESSEL_H
